import { find_things_informations_by_id } from "./bag";
import { jl2D } from "./jl";



// 1. 同时导入 JSON 数据和它的“数据契约”
import allFsItems from "./gamedata/fswq.json";
// import type { ItemData } from "../types";
import type { FswqData } from "./types"; // 确保 types.ts 存在于 src 目录下并导出 ItemData

// 2. 创建一个道具数据库，方便通过 ID 快速查找
//    我们用 Map 来存储，键是道具 ID，值是道具数据。
const itemDatabase = new Map<string, FswqData>();

// 3. 遍历导入的 JSON 数组，填充数据库
//    我们在这里使用 `as ItemData[]` 进行类型断言，
//    意思是告诉 TypeScript：“请相信我，这个 allItems 数组里的每个成员，都符合 ItemData 这个契约”。
//    如果 JSON 文件中的某个字段写错了（比如把 name 写成了 Name），TypeScript 在这里可能不会报错，
//    但在后续使用时，错误依然会被捕捉到。
for (const item of allFsItems as FswqData[]) {
  // Ensure id is a string for the Map key
  itemDatabase.set(String(item.id), { ...item, id: String(item.id) });
}
// 这样，我们就有了一个类型安全的道具数据库，

// 4. 创建一个函数来获取道具数据

/**
 * 获取指定 ID 的道具数据
 * @param itemId 道具的唯一标识符
 * @returns 指定 ID 的道具数据
 */
export function getFsItem(itemId: string): FswqData | undefined {
  return itemDatabase.get(itemId);
}



/**
 * 使用副手武器攻击
 * @param entity 使用武器的玩家
 * @param wqId 使用的武器ID
 * @param raycast 射线检测结果
 * @param rotation 视角信息（暂时没用写上就行）
 */
export function useFswq(entity:GamePlayerEntity,wqId:number,raycast: GameRaycastResult,rotation: { yaw: number, pitch: number }) {
    if (!entity.canFsAttack){
        console.warn("error:can't FsAttack!");
        return; 
    } 
    
    const fswqs = getFsItem(String(wqId));
    if (!fswqs){
        console.warn("error:can't find fswq by id:"+wqId);
        return;
    }
    console.log(entity.player.name+'...FsAttack! id:'+wqId);
        entity.canFsAttack = false;
        entity.player.removeWearable(entity.player.wearables(GameBodyPart.TORSO)[0]);
        entity.player.addWearable({
            bodyPart: GameBodyPart.TORSO,
            mesh: fswqs.attackMesh,
            orientation: new GameQuaternion(0, 1, 0, 0).rotateY(Math.PI/2),
            scale: new GameVector3(1, 1, 1),
            offset: new GameVector3(0, 0, 0),
        });
        const tx = entity.player.wearables(GameBodyPart.TORSO)[0];
        entity.fy = fswqs.attackDefense;
        const damageInterval = setInterval(() => {
            const damage = fswqs.attackBasicDamage+fswqs.attackLevelAdd*entity.level/5;
            // 搜索范围 
            
            world.querySelectorAll('.canhurt').forEach( (e) => {
                // 在区域的实体
                if ( e!==entity && !e.player && jl2D(e.position,entity.position)<3 && Math.abs(e.position.y-entity.position.y)<5) {
                    e.takeDamage_by_player(damage,entity);
                }
            });
        }, 200);

        setTimeout(() => {
            entity.player.removeWearable(tx);
            clearInterval(damageInterval);
            entity.fy = (fswqs.defense); // 恢复玩家防御力
        }, fswqs.attackTime);

        setTimeout(() => {
            entity.canFsAttack = true;
        }, fswqs.attackCoolingTime);
}